package common.constant;

import lombok.Getter;

/**
 * 结果状态码枚举。
 * <p>
 * 用于统一接口返回的状态码和提示信息，既包含常见的 HTTP 状态码，
 * 也扩展了业务层面的错误码，方便前后端约定和使用。
 * </p>
 */
@Getter
public enum ResultCode {

    // -------------------- HTTP 标准状态码 --------------------

    /**
     * 成功
     */
    SUCCESS(200, "操作成功"),

    /**
     * 参数错误
     */
    PARAM_ERROR(400, "参数错误"),

    /**
     * 未认证（未登录或登录过期）
     */
    UNAUTHORIZED(401, "未登录或登录已过期"),

    /**
     * 无权限
     */
    FORBIDDEN(403, "无访问权限"),

    /**
     * 资源不存在
     */
    NOT_FOUND(404, "资源不存在"),

    /**
     * 系统错误
     */
    ERROR(500, "系统错误，请稍后重试"),

    // -------------------- 自定义业务状态码 --------------------

    /**
     * 业务逻辑错误
     */
    BUSINESS_ERROR(1000, "业务逻辑错误"),

    /**
     * 数据库操作错误
     */
    DATABASE_ERROR(1001, "数据库操作失败"),

    /**
     * 网络错误
     */
    NETWORK_ERROR(1002, "网络连接失败"),

    /**
     * 文件操作错误
     */
    FILE_ERROR(1003, "文件操作失败");

    /**
     * 状态码
     */
    private final int code;

    /**
     * 状态码对应的提示信息
     */
    private final String message;

    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 根据数值 code 获取对应的枚举实例。
     *
     * @param code 数值状态码
     * @return 对应的 {@link ResultCode}，如果未找到则返回 {@code null}
     */
    public static ResultCode fromCode(int code) {
        for (ResultCode result : values()) {
            if (result.getCode() == code) {
                return result;
            }
        }
        return null;
    }
}
